﻿using System;
using System.Threading;
using System.Windows.Forms;

namespace JoinBox
{
    public partial class AcadIntermediary : Form
    {
        /// <summary> 
        /// Acad2008无法WPF多线程直接交互,为此建立桥梁.
        /// bug是Acad2008调试WPF时候执行良好,但是直接运行却无法实现多线程的委托获取.
        /// 实例化时必须在Acad主线程中
        /// </summary>
        public AcadIntermediary()
        {
            InitializeComponent();
            this.ShowInTaskbar = false;
            this.WindowState = FormWindowState.Minimized;
            //CheckForIllegalCrossThreadCalls = false;  //取消线程安全的开关
            Load += Start_Load;
        }

        private void Start_Load(object sender, EventArgs e)
        {
            this.Hide();//一定要这句,不然左下角有一条小小的标题栏           
        }

        //新建线程之后以委托方式可以切换图纸.
        //但是同样的代码,WPF却会被 推帧Dispatcher.Run() 报错
        //所以只能以winform作为中介了.
        public void Action(Action ac)
        {
            while (true)
            {
                //句柄创建后才可以用委托
                if (this.IsHandleCreated)
                {
                    //Acap.IsQuiescent表示cad启动界面完成,但是创建文档的时候会为false,表示占用cad,
                    //所以不使用它,以免无法调度创建文档时候的处理.
                    //当前如果有活动命令,会致命错误,所以发送esc直到取消完命令
                    if (CadSystem.Getvar("cmdnames") == "")
                    {
                        Invoke((Action)delegate ()//调度Acad的线程安全
                        {
                            ac?.Invoke();
                        });
                        break;
                    }
                }
                Thread.Sleep(100);
            }
        }

        //==================================================================================================

        /// <summary>
        /// 让程序不显示在alt+Tab视图窗体中
        /// </summary>
        /// https://www.cnblogs.com/xielong/p/6626105.html
        protected override CreateParams CreateParams
        {
            get
            {
                const int WS_EX_APPWINDOW = 0x40000;
                const int WS_EX_TOOLWINDOW = 0x80;
                CreateParams cp = base.CreateParams;
                cp.ExStyle &= ~WS_EX_APPWINDOW;    // 不显示在TaskBar
                cp.ExStyle |= WS_EX_TOOLWINDOW;    // 不显示在Alt+Tab
                return cp;
            }
        }

    }
}
